#!/usr/bin/env python3
"""
股票K线数据分析工具 - 简化版主程序
支持获取指定股票代码和K线周期的数据，并使用TA-Lib计算技术指标
"""

import sys
import os
import logging
from datetime import datetime
from data_fetcher import DataFetcher
from ta_calculator import TechnicalAnalyzer
from utils import validate_stock_data, clean_stock_data
from config import LOG_LEVEL, LOG_FORMAT, OUTPUT_ENCODING, apply_chinese_column_names

# 配置日志
logging.basicConfig(level=LOG_LEVEL, format=LOG_FORMAT)
logger = logging.getLogger(__name__)

def analyze_stock(symbol, period):
    """
    分析指定股票的K线数据
    :param symbol: 股票代码
    :param period: K线周期 ('60分钟', '日线', '周线', '月线')
    :return: 包含技术指标的DataFrame
    """
    logger.info("=" * 70)
    logger.info(f"开始分析: {symbol} [{period}]")
    logger.info("=" * 70)
    
    # 1. 获取数据
    logger.info("初始化数据获取器...")
    fetcher = DataFetcher()
    
    logger.info(f"获取 {symbol} 的 {period} K线数据...")
    df = fetcher.get_data(symbol, period)
    
    if df.empty:
        logger.error("未获取到有效数据")
        return None
    
    logger.info(f"成功获取 {len(df)} 条K线数据")
    logger.info(f"时间范围: {df['timestamp'].min()} 至 {df['timestamp'].max()}")
    
    # 2. 数据验证和清洗
    logger.info("验证和清洗数据...")
    df = validate_stock_data(df)
    if df.empty:
        logger.error("数据验证失败")
        return None
    
    df = clean_stock_data(df)
    if df.empty:
        logger.error("数据清洗失败")
        return None
    
    # 3. 计算技术指标
    logger.info("初始化技术指标计算器...")
    analyzer = TechnicalAnalyzer(period_name=period)

    logger.info("计算技术指标...")
    df = analyzer.calculate_indicators(df)
    
    if df.empty:
        logger.error("指标计算失败")
        return None
    
    # 4. 添加复合信号
    logger.info("添加复合交易信号...")
    df = analyzer.add_derived_signals(df)
    
    # 5. 移除analysis_date列（如果存在）
    if 'analysis_date' in df.columns:
        df = df.drop('analysis_date', axis=1)
    
    logger.info(f"分析完成，最终数据包含 {len(df.columns)} 列")
    
    return df

def save_analysis_result(df, symbol, period):
    """
    保存分析结果到文件
    :param df: 分析结果DataFrame
    :param symbol: 股票代码
    :param period: K线周期
    :return: 保存的文件路径
    """
    if df is None or df.empty:
        logger.warning("数据为空，不保存")
        return None
    
    # 生成文件名
    safe_symbol = symbol.replace(':', '_').replace('/', '_').replace('.', '_')
    date_str = datetime.now().strftime("%Y%m%d_%H%M%S")
    filename = f"{safe_symbol}_{period}_{date_str}_analysis.csv"
    
    try:
        # 确保数据按时间排序
        df.sort_values('timestamp', inplace=True)

        # 应用中文列名映射
        df_chinese = apply_chinese_column_names(df.copy())

        # 保存到CSV（使用中文列名）
        df_chinese.to_csv(filename, index=False, encoding=OUTPUT_ENCODING)
        logger.info(f"分析结果已保存至: {filename}")
        logger.info(f"文件大小: {os.path.getsize(filename)/1024:.2f} KB")
        
        return filename
    except Exception as e:
        logger.error(f"保存文件失败: {e}")
        return None

def print_data_summary(df, symbol, period):
    """
    打印数据摘要信息
    :param df: 分析结果DataFrame
    :param symbol: 股票代码
    :param period: K线周期
    """
    if df is None or df.empty:
        return
    
    print("\n" + "=" * 60)
    print(f"数据摘要 - {symbol} [{period}]")
    print("=" * 60)
    
    # 基本信息
    print(f"数据量: {len(df)} 条K线")
    print(f"时间范围: {df['timestamp'].min()} 至 {df['timestamp'].max()}")
    print(f"数据列数: {len(df.columns)}")
    
    # 价格统计
    latest = df.iloc[-1]
    print(f"\n最新价格信息:")
    print(f"  时间: {latest['timestamp']}")
    print(f"  开盘: {latest['open']:.2f}")
    print(f"  最高: {latest['high']:.2f}")
    print(f"  最低: {latest['low']:.2f}")
    print(f"  收盘: {latest['close']:.2f}")
    if 'volume' in df.columns:
        print(f"  成交量: {latest['volume']:,.0f}")
    
    # 技术指标摘要
    print(f"\n技术指标摘要:")
    if 'MA20' in df.columns:
        print(f"  20日均线: {latest['MA20']:.2f}")
    if 'RSI' in df.columns:
        print(f"  RSI: {latest['RSI']:.2f}")
    if 'MACD' in df.columns:
        print(f"  MACD: {latest['MACD']:.4f}")
    
    # 交易信号
    print(f"\n最新交易信号:")
    if 'LONG_SIGNAL' in df.columns:
        long_signals = df['LONG_SIGNAL'].sum()
        print(f"  多头信号数量: {long_signals}")
    if 'SHORT_SIGNAL' in df.columns:
        short_signals = df['SHORT_SIGNAL'].sum()
        print(f"  空头信号数量: {short_signals}")
    
    print("=" * 60)

def main():
    """主程序入口"""
    print("股票K线数据分析工具")
    print("支持周期: 60分钟、日线、周线、月线")
    print("=" * 50)
    
    # 检查命令行参数
    if len(sys.argv) != 3:
        print("使用方法: python stock_analyzer.py <股票代码> <K线周期>")
        print("\n示例:")
        print("  python stock_analyzer.py AAPL 60分钟")
        print("  python stock_analyzer.py 600000.SH 日线")
        print("  python stock_analyzer.py 0700.HK 周线")
        print("  python stock_analyzer.py RB9999 月线")
        print("\n支持的周期: 60分钟, 日线, 周线, 月线")
        sys.exit(1)
    
    symbol = sys.argv[1]
    period = sys.argv[2]
    
    # 验证周期参数
    valid_periods = ['60分钟', '日线', '周线', '月线']
    if period not in valid_periods:
        print(f"错误: 不支持的周期 '{period}'")
        print(f"支持的周期: {', '.join(valid_periods)}")
        sys.exit(1)
    
    try:
        # 执行分析
        df = analyze_stock(symbol, period)
        
        if df is not None:
            # 打印摘要
            print_data_summary(df, symbol, period)
            
            # 保存结果
            filename = save_analysis_result(df, symbol, period)
            
            if filename:
                print(f"\n✅ 分析完成！结果已保存到: {filename}")
                print("\n💡 提示: 可以将CSV文件导入Excel或其他工具进行进一步分析")
            else:
                print("\n❌ 保存失败，但分析数据已生成")
        else:
            print("\n❌ 分析失败，请检查股票代码和网络连接")
            sys.exit(1)
            
    except KeyboardInterrupt:
        print("\n程序被用户中断")
        sys.exit(1)
    except Exception as e:
        logger.exception("程序运行出错")
        print(f"\n❌ 程序出错: {e}")
        sys.exit(1)

if __name__ == "__main__":
    main()
